package com.xiaoda.controller;

import com.xiaoda.entity.Article;
import com.xiaoda.entity.JsonResult;
import com.xiaoda.entity.User;
import com.xiaoda.service.ArticleService;
import com.xiaoda.service.CollectService;
import com.xiaoda.service.CommentService;
import com.xiaoda.service.LikeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 文章管理
 */

@Controller
@CrossOrigin
@RequestMapping("/article")
@ResponseBody
public class ArticleController {

    @Autowired
    ArticleService articleService;

    @Autowired
    CommentService commentService;

    @Autowired
    CollectService collectService;

    @Autowired
    LikeService likeService;

    /**
     * 通过关键字获取文章列表
     *
     * @param keyword 关键字
     * @param start   起始位置
     * @param end     结束位置
     * @return 文章列表
     */
    @PostMapping("/keyword")
    public JsonResult keyword(@RequestParam(name = "keyword", defaultValue = "") String keyword,
                              @RequestParam(name = "start", defaultValue = "0") int start,
                              @RequestParam(name = "end", defaultValue = "5") int end) {
        JsonResult json = new JsonResult();
        List<Article> list = articleService.findByKeyword(keyword, start, end);
        if (list.isEmpty()) {
            json.setCode(404);
            json.setMsg("未查到帖子数据！！！");
        } else {
            json.setCode(200);
            json.setMsg("帖子数据查询成功！！！");
        }
        json.setData(list);
        return json;
    }

    /**
     * 通过文章 id 获取文章信息
     *
     * @param id      文章 id
     * @param fromUid 用户 id
     * @return 文章信息
     * @throws IllegalAccessException 反射异常
     */
    @GetMapping("/detail/{id}")
    public JsonResult detail(@PathVariable("id") int id,
                             @RequestParam("fromUid") String fromUid) throws IllegalAccessException {
        JsonResult json = new JsonResult();
        Article article = articleService.findFullById(id);
        Map<String, Object> map = new HashMap<>();
        if (article == null) {
            json.setCode(404);
            json.setMsg("未查到帖子数据！！！");
        } else {
            json.setCode(200);
            json.setMsg("帖子数据查询成功！！！");
            Class<?> clazz = article.getClass();
            for (Field filed : clazz.getDeclaredFields()) {
                filed.setAccessible(true);
                map.put(filed.getName(), filed.get(article));
            }

            if (map.get("createTime") != null) {
                map.put("createTime", article.getCreateTime());
            }

            if (map.get("uid") != null) {
                ((User) map.get("uid")).setPassword(null);
            }
            map.put("isCollected", collectService.isCollected(fromUid, id) != null);
            map.put("isLiked", likeService.isArticleLiked(fromUid, id) != null);
        }
        json.setData(map);
        return json;
    }

    /**
     * 通过用户 id 获取关注人发布的文章列表
     *
     * @param account 用户 id
     * @param start   起始位置
     * @param end     结束位置
     * @return 文章列表
     */
    @GetMapping("/concern")
    public JsonResult concern(@RequestParam("account") String account,
                              @RequestParam(name = "start", defaultValue = "0") int start,
                              @RequestParam(name = "end", defaultValue = "7") int end) {
        JsonResult json = new JsonResult();
        List<Article> list = articleService.findConcern(account, start, end);
        List<Map<String, Object>> mlist = new ArrayList<>();
        if (list.isEmpty()) {
            json.setCode(404);
            json.setMsg("未查到帖子数据！！！");
        } else {
            json.setCode(200);
            json.setMsg("关注列表帖子数据查询成功！！！");
            for (Article art : list) {
                art.getUid().setPassword(null);
            }
            mlist = returnArticleCard(account, list, true);
        }
        json.setData(mlist);
        return json;
    }

    /**
     * 通过用户 id 获取推荐帖子列表
     *
     * @param account 用户 id
     * @param start   起始位置
     * @param end     结束位置
     * @return 推荐帖子列表
     */
    @GetMapping("/recommend")
    public JsonResult recommend(
            @RequestParam("account") String account,
            @RequestParam(name = "start", defaultValue = "0") int start,
            @RequestParam(name = "end", defaultValue = "7") int end) {
        JsonResult json = new JsonResult();
        List<Article> more = articleService.findMoreThan(start, end);
        List<Map<String, Object>> mlist = new ArrayList<>();
        if (more != null && !more.isEmpty()) {
            json.setCode(200);
            json.setMsg("推荐帖子列表数据查询成功！！！");
            for (Article art : more) {
                art.getUid().setPassword(null);
            }
            mlist = returnArticleCard(account, more, true);
        } else {
            List<Article> less = articleService.findLessThan(start, end);
            if (less != null && !less.isEmpty()) {
                json.setCode(200);
                json.setMsg("推荐帖子列表数据查询成功！！！");
                for (Article art : less) {
                    art.getUid().setPassword(null);
                }
                mlist = returnArticleCard(account, less, true);
            } else {
                json.setCode(404);
                json.setMsg("推荐帖子列表数据查询失败！！！");
            }
        }
        json.setData(mlist);
        return json;
    }

    /**
     * 获取热榜帖子列表
     *
     * @return 热榜帖子列表
     */
    @GetMapping("/top")
    public JsonResult top() {
        JsonResult json = new JsonResult();
        List<Article> list = articleService.findTop50();
        if (list == null || list.isEmpty()) {
            json.setCode(404);
            json.setMsg("热榜帖子列表数据查询失败！！！");
        } else {
            json.setCode(200);
            json.setMsg("热榜帖子列表数据查询成功！！！");
        }
        json.setData(list);
        return json;
    }

    /**
     * 获取用户发布的文章列表
     *
     * @param uid   用户 id
     * @param start 起始位置
     * @param end   结束位置
     * @return 用户发布的文章列表
     */
    @GetMapping("/count")
    public JsonResult count(@RequestParam("uid") String uid,
                            @RequestParam("start") int start,
                            @RequestParam("end") int end) {
        JsonResult json = new JsonResult();
        List<Article> list = articleService.findAllByUid(uid, start, end);
        List<Map<String, Object>> mlist = this.returnArticleCard(uid, list, false);
        if (list.isEmpty()) {
            json.setCode(404);
            json.setMsg("未查询到发布的文章！！！");
        } else {
            json.setCode(200);
            json.setMsg("发布的文章查询成功！！！");
        }
        json.setData(mlist);
        return json;
    }

    /**
     * 获取用户收藏的文章列表
     *
     * @param account 用户 id
     * @param start   起始位置
     * @param end     结束位置
     * @return 用户收藏的文章列表
     */
    @GetMapping("/treasure")
    public JsonResult treasure(@RequestParam("account") String account,
                               @RequestParam("start") int start,
                               @RequestParam("end") int end) {
        JsonResult json = new JsonResult();
        List<Article> list = articleService.findAllTreasured(account, start, end);
        if (list.isEmpty()) {
            json.setCode(404);
            json.setMsg("未查到收藏的文章！！！");
        } else {
            json.setCode(200);
            json.setMsg("收藏的文章查询成功！！！");
        }
        json.setData(list);
        return json;
    }

    /**
     * 获取用户喜欢的文章列表
     *
     * @param account 用户 id
     * @param start   起始位置
     * @param end     结束位置
     * @return 用户喜欢的文章列表
     */
    @GetMapping("/hobby")
    public JsonResult hobby(@RequestParam("account") String account,
                            @RequestParam("start") int start,
                            @RequestParam("end") int end) {
        JsonResult json = new JsonResult();
        List<Article> list = articleService.findAllHobbies(account, start, end);
        if (list.isEmpty()) {
            json.setCode(404);
            json.setMsg("未查到喜欢的文章！！！");
        } else {
            json.setCode(200);
            json.setMsg("喜欢的文章查询成功！！！");
        }
        json.setData(list);
        return json;
    }

    /**
     * 获取用户关注的文章列表
     *
     * @param account 用户 id
     * @param aid     文章 id
     * @return 用户关注的文章列表
     */
    @GetMapping("/other")
    public JsonResult other(@RequestParam("account") String account,
                            @RequestParam("aid") int aid) {
        JsonResult json = new JsonResult();
        List<Article> list = articleService.findOtherArticles(account, aid);
        if (list.isEmpty()) {
            json.setCode(404);
            json.setMsg("未查到发布的其余文章！！！");
        } else {
            json.setCode(200);
            json.setMsg("发布的其余文章查询成功！！！");
        }
        json.setData(list);
        return json;
    }

    /**
     * 获取文章详情
     *
     * @param id 文章 id
     * @return 文章详情
     */
    @PostMapping("/look")
    public JsonResult look(@RequestParam("id") int id) {
        JsonResult json = new JsonResult();
        int row = articleService.hasLook(id);
        if (row > 0) {
            json.setCode(200);
            json.setMsg("文章浏览量加一！！！");
        } else {
            json.setCode(404);
            json.setMsg("文章浏览量加一失败！！！");
        }
        json.setData(null);
        return json;
    }

    /**
     * 发布文章
     *
     * @param title   文章标题
     * @param content 文章内容
     * @param account 用户 id
     * @return 发布结果
     */
    @PostMapping("/add")
    public JsonResult add(@RequestParam("title") String title, @RequestParam("content") String content,
                          @RequestParam("account") String account) {
        JsonResult json = new JsonResult();
        int row = articleService.addArticle(title, content, account);
        if (row > 0) {
            json.setCode(200);
            json.setMsg("文章发布成功！！！");
        } else {
            json.setCode(404);
            json.setMsg("文章发布失败！！！");
        }
        json.setData(null);
        return json;
    }

    /**
     * 发布文章
     *
     * @param map 文章信息
     * @return 发布结果
     */
    @PostMapping("/insert")
    public JsonResult insert(@RequestBody Map<String, Object> map) {
        JsonResult json = new JsonResult();
        int row = articleService.insertArticle(map);
        if (row > 0) {
            json.setCode(200);
            json.setMsg("文章发布成功！！！");
        } else {
            json.setCode(404);
            json.setMsg("文章发布失败！！！");
        }
        json.setData(null);
        return json;
    }

    /**
     * 根据条件查询文章
     *
     * @param map 查询条件
     * @return 查询结果
     */
    @PostMapping("/search")
    public JsonResult search(@RequestBody Map<String, Object> map) {
        JsonResult json = new JsonResult();
        List<Article> list = articleService.searchArticles(map);
        if (list.isEmpty()) {
            json.setCode(404);
            json.setMsg("未查到文章！！！");
        } else {
            json.setCode(200);
            json.setMsg("文章查询成功！！！");
        }
        json.setData(list);
        return json;
    }

    /**
     * 删除文章
     *
     * @param id 文章 id
     * @return 删除结果
     */
    @DeleteMapping("/delete/{id}")
    public JsonResult delete(@PathVariable("id") int id) {
        JsonResult json = new JsonResult();
        int row = articleService.deleteById(id);
        if (row > 0) {
            json.setCode(200);
            json.setMsg("文章删除成功！！！");
        } else {
            json.setCode(404);
            json.setMsg("文章删除失败！！！");
        }
        json.setData(null);
        return json;
    }

    /**
     * 修改文章
     *
     * @param article 文章对象
     * @return 修改结果
     */
    @PutMapping("/update")
    public JsonResult update(@RequestBody Map<String, Object> article) {
        JsonResult json = new JsonResult();
        int row = articleService.updateArticle(article);
        if (row > 0) {
            json.setCode(200);
            json.setMsg("文章修改成功！！！");
        } else {
            json.setCode(404);
            json.setMsg("文章修改失败！！！");
        }
        json.setData(null);
        return json;
    }

    /**
     * 处理文章对象
     *
     * @param account 用户 id
     * @param list    文章列表
     * @param hidden  隐藏密码
     * @return 文章对象
     */
    public List<Map<String, Object>> returnArticleCard(String account, List<Article> list,
                                                       boolean hidden) {
        List<Map<String, Object>> mlist = new ArrayList<>();
        for (Article art : list) {
            Map<String, Object> map = new HashMap<>();
            map.put("id", art.getId());
            map.put("title", art.getTitle());
            map.put("content", art.getContent());
            if (hidden) {
                art.getUid().setPassword(null);
            }
            map.put("uid", art.getUid());
            map.put("count", art.getCount());
            map.put("createTime", art.getCreateTime());
            map.put("commentNum", commentService.commentArticleNum(art.getId()));
            map.put("isCollected", collectService.isCollected(account, art.getId()) != null);
            map.put("isLiked", likeService.isArticleLiked(account, art.getId()) != null);
            map.put("checked", likeService.findByUid(account, art.getUid().getAccount()) != null);
            mlist.add(map);
        }
        return mlist;
    }

}